package com.qtenv.datasync.api.wuyang;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.util.HashMap;
import java.util.Map;

public class WuYangApi {
    private final static String APP_ID = "2";
    private final static String API_KEY = "1350fee134a4ad0cae4da9a8";
    private final static String DEV_URL = "http://test.yourmeter.cn/umeter/openApi";
    private final static String PROD_URL = "http://service.yourmeter.cn/openApi";

    private final static String URL = DEV_URL;

    /**
     * 查询表计档案最新数据（根据表号和更新时间）
     *
     * @param meterCode  表号
     * @param updateTime 更新时间，传入仅返回此时间后有更新的数据, 不传入默认所有数据
     * @return 表计档案最新数据
     */
    private static JSONObject getDatas(String meterCode, String updateTime) {
        return doGetDatas(meterCode, updateTime, null, null, 1, 1000);
    }

    /**
     * 查询表计档案最新数据（满参）
     *
     * @param meterCode  表号
     * @param updateTime 更新时间，传入仅返回此时间后有更新的数据, 不传入默认所有数据
     * @param name       姓名，按姓名模糊匹配
     * @param address    地址，按地址模糊匹配
     * @param pageNo     页码
     * @param pageSize   每页记录数
     * @return 表计档案最新数据
     * <p>
     * ========================返回参数说明========================
     * meterCode        String(14) 表号 设备号
     * userCode         String(15) 用户号 用户号 / 缴费编号
     * endCode          Double(18,3) 止码 累计用水/电量
     * deviceCate       Int(1) 设备类型 1 水表 2 电表 3 气表
     * valveState       Int(1) 阀门状态 1 开阀 0 关阀
     * batteryState     Int(1) 电池状态 1 低电 0 正常
     * temperature      Double(18,2) 温度 通讯模组运行温度
     * updateTime       DateTime 更新时间 最后上传时间
     * voltage          Double(18,2) 电压值 电池电压值
     * magneticState    Int(1) 强磁状态 1 强磁 0 正常
     * riss             Int(2) 信号值 0~31
     * remainNum        Double(18,2) 剩余金额/量 仅预付费表有效
     * NAME             String(50) 姓名 档案登录姓名
     * address          String(50) 地址 档案地址 装表位置
     * ========================返回参数说明========================
     */
    private static JSONObject doGetDatas(String meterCode, String updateTime, String name, String address, int pageNo, int pageSize) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("meterCode", meterCode);
        paramMap.put("pageNo", pageNo);
        paramMap.put("pageSize", pageSize);
        if (StrUtil.isNotBlank(name)) {
            paramMap.put("name", name);
        }
        if (StrUtil.isNotBlank(address)) {
            paramMap.put("address", address);
        }
        paramMap.put("updateTime", updateTime);

        String bodyStr = JSONUtil.toJsonStr(paramMap);
        System.out.println("请求参数：" + bodyStr);
        String sign = DigestUtil.md5Hex(bodyStr + API_KEY);
        String result = HttpRequest.post(URL + "/meters/getDatas").header("appId", APP_ID).header("sign", sign).contentType("application/json").body(bodyStr).execute().body();
        System.out.println("返回结果：" + JSONUtil.toJsonStr(result));

        if (StrUtil.isNotBlank(result)) {
            return JSONUtil.parseObj(result);
        }

        return null;
    }

    /**
     * 远程控阀控制
     *
     * @param meterCode 表号
     * @param type      操作类型 0 关阀、 1 开阀
     * @param isForce   强制标志 1 强制 0 自动 默认1 恢复 2
     * @return ========================传入参数说明========================
     * 场景                                   isForce type
     * 1 表计不欠费时(欠物业或房租等其他费)强制关阀  1          0
     * 2 恢复平台费控功能                       2          2
     * 3 表计欠费 强制开阀                      1          1
     * 4 缴费开阀 或 补发开阀                   0          1
     * 5 欠费关阀 或补发关阀                    0          0
     * 注：isForce 为 1时 ，会禁用该表在本平台的费控功能，若想恢复应使用 场景 2，第三方平台
     * 实现计费及费控的，请关闭本平台该单位的费控功能
     * ========================传入参数说明========================
     * <p>
     * 返回信息：
     * {
     * "success": true,
     * "errorCode": "-1",
     * "msg": "下发成功",
     * }
     */
    private static JSONObject doControlValve(String meterCode, int type, int isForce) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("meterCode", meterCode);
        paramMap.put("type", type);
        paramMap.put("isForce", isForce);

        String bodyStr = JSONUtil.toJsonStr(paramMap);
        System.out.println("请求参数：" + bodyStr);
        String sign = DigestUtil.md5Hex(bodyStr + API_KEY);
        String result = HttpRequest.post(URL + "/meters/Opt").header("appId", APP_ID).header("sign", sign).contentType("application/json").body(bodyStr).execute().body();
        System.out.println("返回结果：" + JSONUtil.toJsonStr(result));

        if (StrUtil.isNotBlank(result)) {
            return JSONUtil.parseObj(result);
        }

        return null;
    }

    /**
     * 缴费记录查询（通过表号或用户号查询，表号、用户号 必传一项）
     *
     * @param meterCode 表号
     * @param userCode  用户号
     * @return
     */
    private static JSONObject getRechargeList(String meterCode, String userCode) {
        return doGetRechargeList(meterCode, userCode, null, null, null, null, 1, 1000);
    }

    /**
     * 缴费记录查询（通过表号查询）
     *
     * @param meterCode 表号
     * @return 缴费记录
     */
    private static JSONObject getRechargeListByMeterCode(String meterCode) {
        return doGetRechargeList(meterCode, null, null, null, null, null, 1, 1000);
    }

    /**
     * 缴费记录查询（通过用户号查询）
     *
     * @param userCode 用户号
     * @return 缴费记录
     */
    private static JSONObject getRechargeListByUserCode(String userCode) {
        return doGetRechargeList(null, userCode, null, null, null, null, 1, 1000);
    }

    /**
     * 缴费记录查询
     *
     * @param meterCode    表号
     * @param userCode     用户号
     *                     表号、用户号 必传一项
     * @param orderNumber  缴费订单号
     * @param serialNumber 第三方流水号
     * @param timeFrom     操作人？ 记录操作人 非必传
     * @param timeTo
     * @param pageNo       页码
     * @param pageSize     每页记录数
     * @return 缴费记录
     * <p>
     * ========================返回参数说明========================
     * payType          Int 付款方式 接口充值 为 5
     * orderNumber      String 账单号
     * optUser          String 操作人
     * payTime          String 支付时间 格式：2020-07-27 10:23:12
     * meterCode        String 表号
     * userCode         String 用户号
     * paySum           Double 充值金额
     * ========================返回参数说明========================
     */
    private static JSONObject doGetRechargeList(String meterCode, String userCode, String orderNumber, String serialNumber, String timeFrom, String timeTo, int pageNo, int pageSize) {
        Map<String, Object> paramMap = new HashMap<>();
        if (StrUtil.isNotBlank(meterCode)) {
            paramMap.put("meterCode", meterCode);
        }
        if (StrUtil.isNotBlank(userCode)) {
            paramMap.put("userCode", userCode);
        }
        paramMap.put("pageNo", pageNo);
        paramMap.put("pageSize", pageSize);
        if (StrUtil.isNotBlank(orderNumber)) {
            paramMap.put("orderNumber", orderNumber);
        }
        if (StrUtil.isNotBlank(serialNumber)) {
            paramMap.put("serialNumber", serialNumber);
        }
        if (StrUtil.isNotBlank(timeFrom)) {
            paramMap.put("timeFrom", timeFrom);
        }
        if (StrUtil.isNotBlank(timeTo)) {
            paramMap.put("timeTo", timeTo);
        }

        String bodyStr = JSONUtil.toJsonStr(paramMap);
        System.out.println("请求参数：" + bodyStr);
        String sign = DigestUtil.md5Hex(bodyStr + API_KEY);
        String result = HttpRequest.post(URL + "/meters/rechargeList").header("appId", APP_ID).header("sign", sign).contentType("application/json").body(bodyStr).execute().body();
        System.out.println("返回结果：" + JSONUtil.toJsonStr(result));

        if (StrUtil.isNotBlank(result)) {
            return JSONUtil.parseObj(result);
        }

        return null;
    }

    public static void main(String[] args) {
//        b32ba1f5b2c1d4c7cec5ef920c33a7c7
//        System.out.println(DigestUtil.md5Hex("{\"meterCode\":109011044815,\"updateTime\":\"2020-09-10 12:23:23\",\"pageNo\":1,\"pageSize\":1}" + API_KEY));
//        System.out.println(DigestUtil.md5Hex("{meterCode:109011044815,updateTime:2020-09-10 12:23:23,pageNo:1,pageSize:1}" + API_KEY));
//        JSONObject jsonObject = getDatas("23610240001912", "2024-10-10 00:00:00");
//        JSONObject jsonObject1 = getDatas("", "2024-10-10 00:00:00");
//        JSONObject jsonObject2 = getRechargeListByMeterCode("201907101418");
        JSONObject jsonObject3 = doControlValve("1223543214", 1, 0);
    }
}
